2.2 Pandas数据分析
🎯 学习目标
通过通讯录管理器项目,掌握Pandas DataFrame操作和数据分析
📝 项目预览:通讯录管理器
我们将创建一个功能完整的联系人管理工具,通过这个项目学习:
- DataFrame的创建和基本操作
- 数据筛选和查询
- 数据统计和分组分析
- 文件的导入导出
- 数据的增删改查
1. Pandas简介
什么是Pandas?
Pandas是Python中用于数据分析的核心库,提供了强大的DataFrame对象来处理表格数据。
为什么需要Pandas?
- 表格数据处理:类似Excel,但更强大
- 数据清洗:处理缺失值、重复数据
- 数据聚合:分组统计、数据汇总
- 时间序列:专门的时间数据处理功能
安装Pandas
pip install pandas2. DataFrame基础
创建DataFrame
import pandas as pd
# 从字典创建DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'电话': ['13800138000', '13900139000', '13700137000'],
'邮箱': ['zhang@email.com', 'li@email.com', 'wang@email.com']
}
df = pd.DataFrame(data)
print("通讯录数据:")
print(df)DataFrame属性
print("数据形状:", df.shape) # (3, 3) - 3行3列
print("列名:", list(df.columns)) # ['姓名', '电话', '邮箱']
print("索引:", df.index) # RangeIndex(start=0, stop=3, step=1)
print("数据类型:\n", df.dtypes)数据预览
print("前2条记录:")
print(df.head(2))
print("\n后1条记录:")
print(df.tail(1))
print("\n数据信息:")
print(df.info())
print("\n描述性统计:")
print(df.describe())3. 数据选择和筛选
选择列
# 选择单列
names = df['姓名']
print("所有姓名:", names)
# 选择多列
contact_info = df[['姓名', '电话']]
print("\n联系信息:")
print(contact_info)选择行
# 按位置选择
first_two = df.iloc[:2] # 前2行
print("前2条记录:")
print(first_two)
# 按标签选择
specific = df.loc[0] # 索引为0的行
print("\n第一条记录:")
print(specific)条件筛选
# 单条件筛选
friends = df[df['姓名'].str.contains('三')]
print("姓名包含'三'的联系人:")
print(friends)
# 多条件筛选
complex_filter = df[(df['姓名'].str.startswith('张')) | (df['姓名'].str.startswith('李'))]
print("\n张姓或李姓联系人:")
print(complex_filter)4. 数据操作
添加新数据
# 添加新行
new_contact = {'姓名': '赵六', '电话': '13600136000', '邮箱': 'zhao@email.com'}
df = pd.concat([df, pd.DataFrame([new_contact])], ignore_index=True)
print("添加后数据:")
print(df)修改数据
# 修改特定值
df.loc[0, '电话'] = '13800138001' # 修改第一条记录的电话
print("修改后数据:")
print(df)
# 批量修改
df['邮箱'] = df['邮箱'].str.replace('email.com', 'company.com')
print("\n批量修改邮箱:")
print(df)删除数据
# 删除行
df_dropped = df.drop(0) # 删除索引为0的行
print("删除第一条记录后:")
print(df_dropped)
# 删除列
df_no_email = df.drop('邮箱', axis=1) # 删除邮箱列
print("\n删除邮箱列后:")
print(df_no_email)5. 数据统计和分析
基本统计
# 数值列统计
print("描述性统计:")
print(df.describe())
# 非数值列统计
print("\n姓名统计:")
print(df['姓名'].value_counts())
print("\n唯一值统计:")
print(df.nunique()) # 每列的唯一值数量分组统计
# 添加分组列
df['分组'] = ['朋友', '同事', '家人', '朋友']
# 按分组统计
group_stats = df.groupby('分组').agg({
'姓名': 'count', # 人数
'电话': lambda x: list(x) # 电话列表
})
print("分组统计:")
print(group_stats)数据排序
# 按姓名排序
sorted_df = df.sort_values('姓名')
print("按姓名排序:")
print(sorted_df)
# 多列排序
multi_sorted = df.sort_values(['分组', '姓名'])
print("\n先按分组再按姓名排序:")
print(multi_sorted)6. 文件操作
导出为CSV
# 导出数据
df.to_csv('contacts.csv', index=False, encoding='utf-8-sig')
print("数据已导出到 contacts.csv")
# 导出时选择列
df[['姓名', '电话']].to_csv('simple_contacts.csv', index=False)
print("简化版数据已导出")从CSV导入
# 导入数据
imported_df = pd.read_csv('contacts.csv')
print("导入的数据:")
print(imported_df)
# 导入时指定参数
df_with_params = pd.read_csv('contacts.csv', encoding='utf-8-sig')
print("\n带参数导入:")
print(df_with_params.head())7. 数据清洗
处理缺失值
# 创建有缺失值的数据
data_with_na = {
'姓名': ['张三', '李四', None, '赵六'],
'电话': ['13800138000', None, '13700137000', '13600136000'],
'邮箱': ['zhang@email.com', 'li@email.com', 'wang@email.com', None]
}
df_na = pd.DataFrame(data_with_na)
print("有缺失值的数据:")
print(df_na)
# 检查缺失值
print("\n缺失值统计:")
print(df_na.isnull().sum())
# 填充缺失值
df_filled = df_na.fillna('未知')
print("\n填充后数据:")
print(df_filled)处理重复值
# 创建有重复值的数据
data_duplicate = {
'姓名': ['张三', '李四', '张三', '王五'],
'电话': ['13800138000', '13900139000', '13800138000', '13700137000']
}
df_dup = pd.DataFrame(data_duplicate)
print("有重复值的数据:")
print(df_dup)
# 删除重复值
df_unique = df_dup.drop_duplicates()
print("\n去重后数据:")
print(df_unique)8. 字符串操作
字符串方法
# 字符串操作
df['姓名大写'] = df['姓名'].str.upper()
df['姓名长度'] = df['姓名'].str.len()
df['邮箱域名'] = df['邮箱'].str.split('@').str[1]
print("字符串操作结果:")
print(df[['姓名', '姓名大写', '姓名长度', '邮箱', '邮箱域名']])正则表达式
# 使用正则表达式提取信息
import re
df['电话前缀'] = df['电话'].str.extract(r'(\d{3})')
print("电话前缀提取:")
print(df[['电话', '电话前缀']])📋 通讯录管理器完整代码解析
让我们看看项目中的关键代码:
import pandas as pd
def create_contact_dataframe():
"""创建通讯录DataFrame"""
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'电话': ['13800138000', '13900139000', '13700137000', '13600136000'],
'邮箱': ['zhang@email.com', 'li@email.com', 'wang@email.com', 'zhao@email.com'],
'分组': ['朋友', '同事', '家人', '朋友']
}
df = pd.DataFrame(data)
return df
def search_contacts(df, keyword):
"""搜索联系人"""
mask = (df['姓名'].str.contains(keyword)) | \
(df['电话'].str.contains(keyword)) | \
(df['邮箱'].str.contains(keyword))
results = df[mask]
return results
def main():
"""主程序"""
df = create_contact_dataframe()
print("=== 通讯录管理器 ===")
print("当前联系人:")
print(df)
# 搜索示例
keyword = input("\n请输入搜索关键词: ")
results = search_contacts(df, keyword)
if len(results) > 0:
print(f"找到 {len(results)} 个匹配的联系人:")
print(results)
else:
print("没有找到匹配的联系人")
if __name__ == "__main__":
main()🎯 学习要点总结
- DataFrame创建:
pd.DataFrame()从字典创建表格数据 - 数据选择:
df[列名],df.iloc[行号],df.loc[标签] - 条件筛选:
df[条件], 使用布尔索引进行复杂查询 - 数据操作:添加、修改、删除行和列
- 统计分析:
describe(),value_counts(),groupby() - 文件操作:
to_csv(),read_csv()导入导出数据 - 数据清洗:处理缺失值、重复值
- 字符串操作:Pandas的字符串方法
💡 练习建议
- 运行代码:打开
code/第二阶段/2.2_通讯录管理器.py体验功能 - 扩展功能:添加生日、地址、备注等字段
- 数据验证:实现电话号码、邮箱格式验证
- 高级搜索:支持模糊搜索、组合条件搜索
- 数据备份:实现自动备份和恢复功能
🚀 Pandas的优势
- 数据整合:轻松处理各种格式的数据
- 数据清洗:强大的数据预处理功能
- 数据分析:丰富的统计和聚合方法
- 可视化集成:与Matplotlib等库完美配合
- 性能优化:底层使用NumPy,性能优秀
🚀 实际应用场景
- 数据清洗:处理Excel、CSV文件中的数据
- 数据分析:业务数据统计和分析
- 数据转换:数据格式转换和整理
- 数据报告:自动生成数据报告
- 机器学习:数据预处理和特征工程
🚀 下一步
掌握Pandas后,你可以继续学习:
- 2.3 数据可视化:用Matplotlib展示数据
- 第三阶段:机器学习基础
- 实际项目:用Pandas处理真实数据集
记住:Pandas是数据分析的瑞士军刀,熟练掌握它能让数据工作事半功倍!
学习愉快!多练习DataFrame操作,这是数据分析的核心技能!